package com.ftg.learn.chapter09.reflech.demo02.service;

import com.ftg.learn.chapter09.reflech.demo02.entity.Dog;

import java.util.Objects;

/**
 * 面向接口编程 :
 * 面向父类编程 :
 *
 * @author kangjx
 * @date 2023/1/13
 */
public class MyDeelClass {

    private Object[] mcis;

    public void createClass(MyClassInfo[] ms) {
        this.mcis = new Object[ms.length];
//        Objects; 帮助类
        if (Objects.isNull(ms)) {
            throw new RuntimeException("ms不能为空");
        }

        /**
         * 每一次生成，都是从0开始，多次调用会产生覆盖效果
         */
        int i = 0;
        for (MyClassInfo info : ms) {
            try {
                mcis[i++] = info.getMyself().newInstance();
            } catch (InstantiationException | IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }

    public Object[] getMcis() {
        return mcis;
    }

    /**
     * 通过判断类名来完成查找
     *
     * @param className 类名
     * @return
     */
    public Object findInstance(String className) {
        for (Object mci : mcis) {
            String tempName = mci.getClass().getName();
            if (tempName.substring(tempName.lastIndexOf(".") + 1).equals(className)) {
                return mci;
            }
        }
        return null;
    }

    public static void main(String[] args) {
        MyDeelClass m = new MyDeelClass();

        MyClassInfo[] ms = new MyClassInfo[2];

        //让人添加一些类的信息进来

        //xml里面配置的class="com.ftg.learn.chapter09.reflech.demo02.entity.Dog""  80
        ms[0] = new MyClassInfo("com.ftg.learn.chapter09.reflech.demo03.entity.Dog");
        ms[1] = new MyClassInfo(Dog.class);

        m.createClass(ms);

        //任何情况下，这个类有且仅有一个实例 : 单例设计模式
        Dog dog = (Dog) m.findInstance("Dog");

        dog.setDname("张三");
        System.out.println(dog.getDname());

        Dog dog1 = (Dog) m.findInstance("Dog");
        System.out.println(dog1.getDname() + "==>dog1的名称");

        // 用户可以配置
        // 后台自动完成实例化处理
        // 提供一个可以用来存储大量实例的 数组(长度) 容器
    }

    // 我们这次的设计目标是什么 ?
    // 1 : new
    // 1.1 空间上来讲，我们为了节约大量heap空间
    // 1.2 时间上也来优化.
    // 2 Dog   Dog d = new Dog(); 如果有一个对象 大量实例
    // 2.1 如果第一个同类型的引用，指向同一个地址
    // 2.1.1  时间 少
    // 2.1.2  空间  少
    // 3 解决方案
    // 3.1 池化

}
